﻿namespace TRXParserConsole
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    using System.Xml.Linq;
    using System.IO;
    using System.Xml.XPath;

    public class TRXFileInfo
    {
        private FileInfo FileInfo;
        private StreamReader FileStreamReader;
        private string FileData;
        private XmlDocument xmlFile;

        private int total, error, failed, passed;

        private string[] errorTests;

        private string f;

        private string[] states = { "total", "passed", "error", "failed" };

        /// <summary>
        /// Крнструктор класса
        /// </summary>
        /// <param name="f">Имя TRX файла</param>
        public TRXFileInfo(string f)
        {
            this.f = f;
            total = passed = error = failed = 0;
        }

        /// <summary>
        /// Выполняет подсчет результатов анализа файла
        /// </summary>
        public int[] GetInfo()
        {
            FileInfo = new FileInfo(f);
            FileStreamReader = new StreamReader(FileInfo.FullName);
            FileData = FileStreamReader.ReadToEnd();
            xmlFile = new XmlDocument();
            xmlFile.Load(FileInfo.FullName);

            string word;
            for (int i = 0; i < states.Length; i++)
            {
                word = states[i];
                if (word == "total" && ValueOf(word) > 0) { total += ValueOf(word); }
                if (word == "passed" && ValueOf(word) > 0) { passed += ValueOf(word); }
                if (word == "error" && ValueOf(word) > 0) { error += ValueOf(word); }
                if (word == "failed" && ValueOf(word) > 0) { failed += ValueOf(word); }
            }
            errorTests = getErrorTestsName();
            return new int[] { total, passed, error, failed };
        }

        /// <summary>
        /// Общее количество тестов
        /// </summary>
        /// <returns>Врзвращает количество тестов</returns>
        public int GetTotalTests() {
            return total;
        }

        /// <summary>
        /// Количество удачно пройденных тестов
        /// </summary>
        /// <returns>Возвращает количество удачно пройденных тестов</returns>
        public int GetPassedTests() {
            return passed;
        }

        /// <summary>
        /// Количество тестов с ошибкой
        /// </summary>
        /// <returns>Возвращает количество тестов с ошибкой</returns>
        public int GetErrorTests() {
            return error;
        }

        /// <summary>
        /// Количество незаконченных тестов
        /// </summary>
        /// <returns>Возвращает количество незаконченных тестов</returns>
        public int GetFailedTests() {
            return failed;
        }

        /// <summary>
        /// Возвращает массив с именами тестов имеющих ошибку
        /// </summary>
        /// <returns>Массив с именами тестов с ошибкой</returns>
        public string[] getErrorTestNames()
        {
            return errorTests;
        }

        /// <summary>
        /// Выполняет поиск значения для заданного состояния.
        /// </summary>
        /// <param name="word">Состояние</param>
        /// <returns>Возвращает значение соответствующего состояния.</returns>
        private int ValueOf(string word)
        {
            return Convert.ToInt32(xmlFile.GetElementsByTagName("Counters")[0].Attributes[word].Value);
        }

        private string[] getErrorTestsName()
        {
            XmlNodeList elements = xmlFile.GetElementsByTagName("UnitTestResult");
            List<string> errorTests = new List<string>();
            for (int i = 0; i < elements.Count; i++)
            {
                if (elements[i].Attributes["outcome"].Value == "error")
                    errorTests.Add(elements[i].Attributes["testName"].Value);
            }
                return errorTests.ToArray();
        }
    }

}